package gf

import (
	"os"
)

// DeleteFile 尝试删除一个文件。
// 首先检查文件是否存在，然后确认其是否为文件类型，最后执行删除操作。
func (fi *FileStatus) DeleteFile() {
	// 检查文件是否存在。
	fi.Exists()
	if fi.ExIst {
		// 确认路径是否为文件。
		fi.IsFile()
		if fi.IsFiles {
			// 执行删除操作。
			fi.delBase()
			return
		} else {
			// 如果路径不是一个文件，设置相应的错误。
			fi.Err = fi.FileErr.PathIsdir
		}
	} else {
		// 如果文件不存在，记录日志。
		logs.Info(fi.FileErr.FileIsNotExists.Error())
	}
	// 清除错误，表示删除操作完成。
	fi.Err = nil
}

// DeleteFile 删除指定的文件。
//
// 参数:
//
//	filename: 要删除的文件的名称。
//
// 返回值:
//
//	如果文件删除成功或不存在，则返回nil；否则返回错误。
func DeleteFile(filename string) error {
	// 创建一个File对象，用于后续的文件删除操作。
	f := NewFile(filename)

	// 调用File对象的DeleteFile方法来删除文件。
	f.DeleteFile()

	// 返回可能的错误，如果有的话。
	return f.Err
}

// DeleteDir 删除目录
// 该方法用于删除ApiFileStatus实例所指向的目录
// 首先检查目录是否存在，如果存在且确实是一个目录，则进行删除操作
// 如果目录不存在，或者存在但不是一个目录，则记录相应的错误信息
func (fi *FileStatus) DeleteDir() {
	// 检查文件是否存在
	fi.Exists()
	if fi.ExIst {
		// 检查是否存在，防止未初始化的访问
		fi.IsDir() // 判断是否属于文件
		if fi.IsDirs {
			// 如果是目录，则调用底层删除方法进行删除
			fi.delBase()
			return
		} else {
			// 如果存在但不是目录，则记录错误信息
			fi.Err = fi.FileErr.PathIsFile
		}
	} else {
		// 如果目录不存在，则记录日志信息
		logs.Info(fi.FileErr.FileIsNotExists.Error())
	}
	// 最后重置错误信息，确保方法执行后错误状态得到更新
	fi.Err = nil
}

// DeleteDir 删除指定路径下的目录及其内容。
// 参数:
//
//	p: 待删除目录的路径。
//
// 返回值:
//
//	如果删除操作成功，则返回nil；否则返回错误。
func DeleteDir(p string) error {
	// 创建一个File对象，用于操作指定路径的文件或目录。
	f := NewFile(p)
	// 调用Delete方法删除目录及其内容。
	f.Delete()
	// 返回删除操作中可能发生的错误。
	return f.Err
}

// Delete 方法用于删除 FileStatus 实例所代表的文件。
// 如果文件存在，则调用底层删除逻辑进行删除；如果文件不存在，则记录相关信息日志。
func (fi *FileStatus) Delete() {
	fi.Exists() // 判断文件是否存在
	if fi.ExIst {
		fi.delBase() // 文件存在时，调用删除逻辑
		return
	} else {
		// 文件不存在时，记录日志信息
		logs.Info(fi.FileErr.FileIsNotExists.Error())
	}
	fi.Err = nil // 删除操作后，重置错误状态
}

// delBase 删除ApiFileStatus实例所关联的文件
// 该方法内部使用os.Remove来执行文件删除操作，并处理可能的错误
func (fi *FileStatus) delBase() {
	// 开始删除文件
	fi.Err = os.Remove(fi.FileName)
	// 如果删除过程中发生错误
	if fi.Err != nil {
		// 记录文件删除失败的日志
		logs.Error("File deletion failed: ", fi.FileName)
		// 记录具体的错误信息
		logs.Error(fi.Err.Error())
		return
	}
}
